home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / omega / omspec.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-06  |  18.0 KB  |  773 lines

  1. /* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
  2. /* omspec.c */
  3. /* monster special functions */
  4.  
  5. #include "oglob.h"
  6.  
  7.  
  8. void m_sp_mp(m)
  9. struct monster *m;
  10. {
  11.   if (m->attacked && (random_range(3) == 1)) {
  12.     mprint("You feel cursed!");
  13.     p_damage(10,UNSTOPPABLE,"a mendicant priest's curse");
  14.     m_vanish(m);
  15.   }
  16.   else if (! m_statusp(m,NEEDY)) {
  17.     mprint("The mendicant priest makes a mystical gesture....");
  18.     mprint("You feel impressed...");
  19.     Player.alignment += 5;
  20.     if (Player.alignment > 20)
  21.       Player.hp = max(Player.hp,Player.maxhp);
  22.     m_vanish(m);
  23.   }
  24. }
  25.  
  26.  
  27.  
  28. void m_sp_ng(m)
  29. struct monster *m;
  30. {
  31.   if (distance(m->x,m->y,Player.x,Player.y) < 2)
  32.     if ((random_range(5) == 1) || (Player.status[VULNERABLE]>0)) {
  33.       mprint("The night gaunt grabs you and carries you off!");
  34.       mprint("Its leathery wings flap and flap, and it giggles insanely.");
  35.       mprint("It tickles you cunningly to render you incapable of escape.");
  36.       mprint("Finally, it deposits you in a strange place.");
  37.       p_teleport(0);
  38.     }
  39. }
  40.  
  41.  
  42.  
  43.  
  44.  
  45. void m_sp_poison_cloud(m)
  46. struct monster *m;
  47. {
  48.   if (distance(m->x,m->y,Player.x,Player.y) < 3) {
  49.     mprint("A cloud of poison gas surrounds you!");
  50.     if (Player.status[BREATHING] > 0)
  51.       mprint("You can breathe freely, however.");
  52.     else p_poison(7);
  53.   }
  54. }
  55.  
  56.  
  57. void m_sp_explode(m)
  58. struct monster *m;
  59. {
  60.   if ((distance(Player.x,Player.y,m->x,m->y)<2) &&
  61.       (m-> hp > 0) && 
  62.       (m->hp < Monsters[m->id].hp))
  63.     fball(m->x,m->y,m->x,m->y,m->hp);
  64. }
  65.  
  66.  
  67.  
  68. void m_sp_demon(m)
  69. struct monster *m;
  70. {
  71.   int mid;
  72.  
  73.   if (random_range(2)) {
  74.     if ((m->id != ML4+6) && /*succubi don't give fear */
  75.     los_p(m->x,m->y,Player.x,Player.y) &&
  76.     (random_range(30) > Player.level+10) &&
  77.     (Player.status[AFRAID] == 0)) {
  78.       mprint("You are stricken with fear!");
  79.       if (! p_immune(FEAR)) Player.status[AFRAID] += m->level;
  80.       else mprint("You master your reptile brain and stand fast.");
  81.     }
  82.     else m_sp_spell(m);
  83.   }
  84.   if ((m->hp < (m->level * 5)) && (m->hp > 1)) {
  85.     mprint("The demon uses its waning lifeforce to summon help!");
  86.     m->hp = 1;
  87.     switch(m->level) {
  88.     case 3: mid = ML2+1; break; /* night gaunt */
  89.     case 4:
  90.     case 5: mid = ML3+2; break; /* lesser frost demon */
  91.     case 6: mid = ML5+4; break; /* frost demon */
  92.     case 7: mid = ML5+12; break; /* outer circle demon */
  93.     case 8: mid = ML6+10; break; /* demon serpent */
  94.     case 9: mid = ML7+14; break; /* inner circle demon */
  95.     }
  96.     summon(-1,mid);
  97.     summon(-1,mid);
  98.   }
  99. }
  100.  
  101.  
  102. void m_sp_acid_cloud(m)
  103. struct monster *m;
  104. {
  105.   if (m_statusp(m,HOSTILE) &&
  106.       (distance(m->x,m->y,Player.x,Player.y) < 3))
  107.     acid_cloud();
  108. }
  109.  
  110.       
  111. void m_sp_escape(m)
  112. struct monster *m;
  113. {
  114.   if (m_statusp(m,HOSTILE))
  115.     m_vanish(m);
  116. }
  117.  
  118.  
  119. void m_sp_ghost(m)
  120. struct monster *m;
  121. {
  122.   if (m_statusp(m,HOSTILE)) {
  123.     mprint("The ghost moans horribly....");
  124.     p_damage(1,FEAR,"a ghost-inspired heart attack");
  125.     mprint("You've been terrorized!");
  126.     if (! p_immune(FEAR)) Player.status[AFRAID] += m->level;
  127.     else mprint("You master your reptile brain and stand fast.");
  128.   }
  129. }
  130.  
  131.  
  132.  
  133.  
  134. /* random spell cast by monster */
  135. void m_sp_spell(m)
  136. struct monster *m;
  137. {
  138.   char action[80];
  139.   if (m_statusp(m,HOSTILE) && los_p(Player.x,Player.y,m->x,m->y)) {
  140.     if (m->uniqueness == COMMON) strcpy(action,"The ");
  141.     else strcpy(action,"");
  142.     strcat(action,m->monstring);
  143.     strcat(action," casts a spell...");
  144.     mprint(action);
  145.     if (! magic_resist(m->level)) switch (random_range(m->level+7)) {
  146.     case 0: 
  147.       nbolt(m->x,m->y,Player.x,Player.y,m->hit,10);
  148.       break;
  149.     case 1:
  150.       mprint("It seems stronger..."); 
  151.       m->hp += random_range(m->level*m->level);
  152.       break;
  153.     case 2:
  154.       haste(-1);
  155.       break;
  156.     case 3:
  157.       cure(-1);
  158.       break;
  159.     case 4:
  160.       lball(m->x,m->y,Player.x,Player.y,20);
  161.       break;
  162.     case 5:
  163.       enchant(-1);
  164.     case 6:
  165.       snowball(m->x,m->y,Player.x,Player.y,30);
  166.       break;
  167.     case 7:
  168.       bless(0-m->level);
  169.       break;
  170.     case 8:
  171.       p_poison(m->level);
  172.       break;
  173.     case 9:
  174.       sleep_player(m->level/2);
  175.       break;
  176.     case 10:
  177.       fbolt(m->x,m->y,Player.x,Player.y,m->hit*3,50);
  178.       break;
  179.     case 11:
  180.       acquire(0-m->level);
  181.       break;
  182.     case 12:
  183.       dispel(-1);
  184.       break;
  185.     case 13:
  186.       disrupt(Player.x,Player.y,50);
  187.       break;
  188.     case 14:
  189.       if (m->uniqueness == COMMON) {
  190.     strcpy(Str2,"a ");
  191.     strcat(Str2,m->monstring);
  192.       }
  193.       else strcpy(Str2,m->monstring);
  194.       level_drain(m->level,Str2);
  195.       break;
  196.     case 15:
  197.     case 16:
  198.       disintegrate(Player.x,Player.y);
  199.       break;
  200.     }
  201.   }
  202. }
  203.  
  204.  
  205.  
  206. /* monsters with this have some way to hide, camouflage, etc until they 
  207.    attack */
  208. void m_sp_surprise(m)
  209. struct monster *m;
  210. {
  211.   if (m->attacked) {
  212.     if (m_statusp(m,HOSTILE) && 
  213.     (! Player.status[TRUESIGHT]) &&
  214.     m_statusp(m,M_INVISIBLE)) {
  215.       m->monchar = Monsters[m->id].monchar;
  216.       if (! Player.status[ALERT]) {
  217.     switch(random_range(4)) {
  218.     case 0: 
  219.       mprint("You are surprised by a sudden treacherous attack!");
  220.       break;
  221.     case 1: 
  222.       mprint("You are shocked out of your reverie by the scream of battle!");
  223.       break;
  224.     case 2: 
  225.       mprint("Suddenly, from out of the shadows, a surprise attack!");
  226.       break;
  227.     case 3: 
  228.       mprint("A shriek of hatred causes you to momentarily freeze up!");
  229.       break;
  230.     }
  231.     morewait();
  232.     setgamestatus(SKIP_PLAYER);
  233.     m_status_reset(m,M_INVISIBLE);
  234.       }
  235.       else {
  236.     mprint("You alertly sense the presence of an attacker!");
  237.     m_status_reset(m,M_INVISIBLE);
  238.       }    
  239.     }
  240.   }
  241. }
  242.  
  243. void m_sp_whistleblower(m)
  244. struct monster *m;
  245. {
  246.   pml ml;
  247.   if (m_statusp(m,HOSTILE)) {
  248.     alert_guards();
  249.     m->specialf = M_MELEE_NORMAL;
  250.   }
  251. }
  252.  
  253.  
  254. void m_sp_seductor(m)
  255. struct monster *m;
  256. {
  257.   if (m_statusp(m,HOSTILE)) {
  258.     if (m->uniqueness == COMMON) {
  259.       strcpy(Str2,"The ");
  260.       strcat(Str2,m->monstring);
  261.     }
  262.     else strcpy(Str2,m->monstring);
  263.     strcat(Str2," runs away screaming for help....");
  264.     mprint(Str2);
  265.     m_vanish(m);
  266.     summon(-1,-1);
  267.     summon(-1,-1);
  268.     summon(-1,-1);
  269.   }
  270.   else if (distance(Player.x,Player.y,m->x,m->y) < 2) 
  271.     m_talk_seductor(m);
  272.  
  273. }
  274.  
  275.  
  276. void m_sp_demonlover(m)
  277. struct monster *m;
  278. {
  279.   if (distance(Player.x,Player.y,m->x,m->y) < 2) 
  280.     m_talk_demonlover(m);
  281. }
  282.  
  283. void m_sp_eater(m)
  284. struct monster *m;
  285. {
  286.   int i;
  287.   if (Player.rank[COLLEGE]) m_status_set(m,HOSTILE);
  288.   if (m_statusp(m,HOSTILE))
  289.     if (los_p(m->x,m->y,Player.x,Player.y)) {
  290.       mprint("A strange numbing sensation comes over you...");
  291.       morewait();
  292.       Player.mana = Player.mana / 2;
  293.       if (random_range(4)) enchant(-1);
  294.       else dispel(-1);
  295.       Player.pow--;
  296.       if (--Player.pow < 1) p_death("The Eater of Magic");
  297.     }
  298.   if (m->hp < 10) {
  299.     mprint("The Eater explodes in a burst of mana!");
  300.     for(i=0;i<9;i++) 
  301.       manastorm(m->x+Dirs[0][i],m->y+Dirs[0][i],100);
  302.   }
  303. }
  304.  
  305.  
  306. void m_sp_dragonlord(m)
  307. struct monster *m;
  308. {
  309.   if (m_statusp(m,HOSTILE)) {
  310.     if (distance(m->x,m->y,Player.x,Player.y)<2) {
  311.       if (! Player.status[IMMOBILE]) {
  312.     mprint("A gust of wind from the Dragonlord's wings knocks you down!");
  313.     p_damage(25,NORMAL_DAMAGE,"a gust of wind");
  314.     setgamestatus(SKIP_PLAYER);
  315.     Player.status[IMMOBILE]+=2;
  316.       }
  317.       else if (! Constriction) {
  318.     mprint("The Dragonlord grabs you with his tail!");
  319.     Constriction = 25;
  320.     Player.status[IMMOBILE]+=1;
  321.       }
  322.       else if (random_range(2)) {
  323.     mprint("The coils squeeze tighter and tighter...");
  324.     p_damage(Constriction,NORMAL_DAMAGE,"The Dragonlord");
  325.     Player.status[IMMOBILE]+=1;
  326.     Constriction *=2;
  327.       }
  328.       else {
  329.     mprint("The dragonlord hurls you to the ground!");
  330.     p_damage(2*Constriction,NORMAL_DAMAGE,"The Dragonlord");
  331.     Constriction = 0;
  332.       }
  333.       m_sp_spell(m);
  334.     }
  335.     else {
  336.       Constriction = 0;
  337.       if (view_los_p(m->x,m->y,Player.x,Player.y)) {
  338.     if ((! Player.immunity[FEAR]) && (! Player.status[AFRAID])) {
  339.       mprint("You are awestruck at the sight of the Dragonlord.");
  340.       Player.status[AFRAID]+=5;
  341.     }
  342.     if (random_range(3)) {
  343.       m_sp_spell(m);
  344.       m_sp_spell(m);
  345.     }
  346.       }
  347.     }
  348.   }
  349.   else if (distance(m->x,m->y,Player.x,Player.y)<2)
  350.     mprint("You are extremely impressed at the sight of the Dragonlord.");
  351. }
  352.  
  353.  
  354. void m_sp_blackout(m)
  355. struct monster *m;
  356. {
  357.   if ((distance(m->x,m->y,Player.x,Player.y) < 4) &&
  358.       (Player.status[BLINDED] == 0)) {
  359.     mprint("The fungus emits a burst of black spores. You've been blinded!");
  360.     if (Player.status[TRUESIGHT] > 0) mprint("The blindness quickly passes.");
  361.     else Player.status[BLINDED]+=4;
  362.   }
  363.   if (loc_statusp(m->x,m->y,LIT)) {
  364.     mprint("The fungus chirps.... ");
  365.     mprint("The area is plunged into darkness.");
  366.     torch_check();torch_check();torch_check();
  367.     torch_check();torch_check();torch_check();
  368.     spreadroomdark(m->x,m->y,Level->site[m->x][m->y].roomnumber);
  369.     levelrefresh();
  370.   }
  371. }
  372.  
  373.  
  374. void m_sp_bogthing(m)
  375. struct monster *m;
  376. {
  377.   if (Player.status[IMMOBILE] && 
  378.       (distance(Player.x,Player.y,m->x,m->y) < 2)) {
  379.     if (! Player.status[AFRAID]) {
  380.       mprint("As the bogthing touches you, you feel a frisson of terror....");
  381.       if (Player.immunity[FEAR]) mprint("which you shake off.");
  382.       else Player.status[AFRAID]+=2;
  383.     }
  384.     else {
  385.       mprint("The bogthing's touch causes you scream in agony!");
  386.       p_damage(50,UNSTOPPABLE,"fright");
  387.       mprint("Your struggles grow steadily weaker....");
  388.       Player.con--;
  389.       Player.str--;
  390.       if ((Player.con < 3) || (Player.str < 3))
  391.     p_death("congestive heart failure");
  392.     }
  393.   }
  394. }
  395.  
  396.  
  397. void m_sp_were(m)
  398. struct monster *m;
  399. {
  400.   int mid;
  401.   if (m_statusp(m,HOSTILE) || (Phase == 6)) {
  402.     do mid = random_range(ML9-NML_0)+ML1;
  403.     while ((Monsters[mid].uniqueness != COMMON) ||
  404.        (! m_statusp(&(Monsters[mid]),MOBILE)) ||
  405.        (! m_statusp(&(Monsters[mid]),HOSTILE)));
  406.     m->id = Monsters[mid].id;
  407.     m->hp += Monsters[mid].hp;
  408.     m->status |= Monsters[mid].status;
  409.     m->ac = Monsters[mid].ac;
  410.     m->dmg = Monsters[mid].dmg;
  411.     m->speed = Monsters[mid].speed;
  412.     m->immunity |= Monsters[mid].immunity;
  413.     m->xpv += Monsters[mid].xpv;
  414.     m->corpseweight = Monsters[mid].corpseweight;
  415.     m->monchar = Monsters[mid].monchar;
  416.     m->talkf = Monsters[mid].talkf;
  417.     m->meleef = Monsters[mid].meleef;
  418.     m->strikef = Monsters[mid].strikef;
  419.     m->specialf = Monsters[mid].specialf;
  420.     strcpy(Str1,"were-");
  421.     strcat(Str1,Monsters[mid].monstring);
  422.     strcpy(Str2,"dead were-");
  423.     strcat(Str2,Monsters[mid].monstring);
  424.     m->monstring = salloc(Str1);
  425.     m->corpsestr = salloc(Str2);
  426.     m->immunity += pow2(NORMAL_DAMAGE);
  427.     if (los_p(m->x,m->y,Player.x,Player.y)) 
  428.       mprint("You witness a hideous transformation!");
  429.     else mprint("You hear a distant howl.");
  430.   }
  431. }    
  432.  
  433.  
  434. void m_sp_leash(m)
  435. struct monster *m;
  436. {
  437.   if (m->aux1 < 0) {
  438.     m->aux1 = m->x;
  439.     m->aux2 = m->y;
  440.   }
  441.   else if (distance(m->x,m->y,m->aux1,m->aux2) > 5) {
  442.     Level->site[m->x][m->y].creature = NULL;
  443.     m->x = m->aux1;
  444.     m->y = m->aux2;
  445.     Level->site[m->x][m->y].creature = m;
  446.     if (los_p(Player.x,Player.y,m->x,m->y)) 
  447.       mprint("You see the dog jerked back by its chain!");
  448.     else mprint("You hear a strangled sort of yelp!");
  449.   }
  450. }
  451.  
  452. void m_sp_servant(m)
  453. struct monster *m;
  454. {
  455.   pml ml;
  456.   if ((m->id == ML4+12) && (Player.alignment < 0))
  457.     m_status_set(m,HOSTILE);
  458.   else if ((m->id == ML4+13) && (Player.alignment > 0))
  459.     m_status_set(m,HOSTILE);
  460. }
  461.  
  462.  
  463. void m_sp_av(m)
  464. struct monster *m;
  465. {
  466.   if (Player.mana > 0) {
  467.     mprint("You feel a sudden loss of mana!");
  468.     Player.mana -= (max(0,10-distance(m->x,m->y,Player.x,Player.y)));
  469.     dataprint();
  470.   }
  471. }
  472.  
  473. void m_sp_lw(m)
  474. struct monster *m;
  475. {
  476.   if (random_range(2)) {
  477.     if (Level->site[m->x][m->y].locchar == FLOOR) {
  478.       Level->site[m->x][m->y].locchar = LAVA;
  479.       Level->site[m->x][m->y].p_locf = L_LAVA;
  480.     }
  481.     else if (Level->site[m->x][m->y].locchar == WATER) {
  482.       Level->site[m->x][m->y].locchar = FLOOR;
  483.       Level->site[m->x][m->y].p_locf = L_NO_OP;
  484.     }
  485.   }
  486. }
  487.  
  488.  
  489. void m_sp_angel(m)
  490. struct monster *m;
  491. {
  492.   int mid,hostile = FALSE;
  493.   switch(m->aux1) {
  494.   case ATHENA:
  495.   case ODIN: 
  496.     hostile = ((Player.patron == HECATE) || (Player.patron == SET));
  497.     break;
  498.   case SET:
  499.   case HECATE: 
  500.     hostile = ((Player.patron == ODIN) || (Player.patron == ATHENA));
  501.     break;
  502.   case DESTINY:
  503.     hostile = (Player.patron != DESTINY);
  504.     break;
  505.   }
  506.   if (hostile)
  507.     m_status_set(m,HOSTILE);
  508.   if (m_statusp(m,HOSTILE)) {
  509.     mprint("The angel summons a heavenly host!");
  510.     switch(m->level) {
  511.     case 9: mid = ML8+11; break; /* high angel */
  512.     case 8: mid = ML6+11; break; /* angel */
  513.     default:
  514.     case 6: mid = ML3+4; break; /* phantom */
  515.     }
  516.     summon(-1,mid);
  517.     summon(-1,mid);
  518.     summon(-1,mid);
  519.     /* prevent angel from summoning infinitely */
  520.     m->specialf = M_NO_OP;
  521.   }
  522. }
  523.  
  524.  
  525. /* Could completely fill up level */
  526. void m_sp_swarm(m)
  527. struct monster *m;
  528. {
  529.   if (random_range(5)==1) {
  530.     if (view_los_p(m->x,m->y,Player.x,Player.y))
  531.       mprint("The swarm expands!");
  532.     else mprint("You hear an aggravating humming noise.");
  533.     summon(-1,ML4+14);
  534.   }
  535. }
  536.  
  537.  
  538.  
  539.  
  540. /* raise nearby corpses from the dead.... */
  541. void m_sp_raise(m)
  542. struct monster *m;
  543. {
  544.   int x,y;
  545.   pol t;
  546.   for(x=m->x-2;x<=m->x+2;x++)
  547.     for(y=m->y-2;y<=m->y+2;y++)
  548.       if (inbounds(x,y)) 
  549.     if (Level->site[x][y].things != NULL)
  550.       if (Level->site[x][y].things->thing->id == CORPSEID) {
  551.         mprint("The Zombie Overlord makes a mystical gesture...");
  552.         summon(-1,Level->site[x][y].things->thing->charge);
  553.         t = Level->site[x][y].things;
  554.         Level->site[x][y].things = Level->site[x][y].things->next;
  555.         free((char *) t);
  556.       }
  557. }
  558.  
  559.  
  560.  
  561.  
  562. void m_sp_mb(m)
  563. struct monster *m;
  564. {
  565.   if (distance(m->x,m->y,Player.x,Player.y)==1) {
  566.     mprint("The manaburst explodes!");
  567.     if (m_statusp(m,HOSTILE)) {
  568.       mprint("You get blasted!");
  569.       p_damage(random_range(100),UNSTOPPABLE,"a manaburst");
  570.       mprint("You feel cold all over!");
  571.       Player.pow-=3;
  572.       Player.iq--;
  573.       Player.con--;
  574.       Player.str-=2;
  575.       Player.dex--;
  576.       Player.agi--;
  577.       dispel(-1);
  578.     }
  579.     else {
  580.       mprint("You feel toasty warm inside!");
  581.       Player.pow++;
  582.       Player.mana = max(Player.mana,calcmana());
  583.       Player.hp = max(Player.hp,++Player.maxhp);
  584.     }
  585.     m->hp = 0;
  586.   }
  587. }
  588.  
  589.  
  590. void m_sp_mirror(m)
  591. struct monster *m;
  592. {
  593.   int i,x,y;
  594.   if (view_los_p(m->x,m->y,Player.x,Player.y)) {
  595.     if (random_range(20)+6 < m->level) {
  596.       summon(-1,m->id);
  597.       mprint("You hear the sound of a mirror shattering!");
  598.     }
  599.     else for(i=0;i<5;i++) {
  600.       x = m->x + random_range(13)-6;
  601.       y = m->y + random_range(13)-6;
  602.       if (inbounds(x,y)) {
  603.     Level->site[x][y].showchar = m->monchar;
  604.     putspot(x,y,m->monchar);
  605.       }
  606.     }
  607.   }
  608. }
  609.  
  610.  
  611.  
  612. void m_illusion(m)
  613. struct monster *m;
  614. {
  615.   int i = random_range(NUMMONSTERS);
  616.   if (i==ML0+4) i = m->id; /* can't imitate NPC */
  617.   if (Player.status[TRUESIGHT]) {
  618.     m->monchar = Monsters[m->id].monchar;
  619.     m->monstring = Monsters[m->id].monstring;
  620.   }
  621.   else  if (random_range(5) == 1) {
  622.     m->monchar = Monsters[i].monchar;
  623.     m->monstring = Monsters[i].monstring;
  624.   }
  625. }
  626.  
  627.  
  628.  
  629.  
  630. void m_huge_sounds(m)
  631. struct monster *m;
  632. {
  633.   if (m_statusp(m,AWAKE) &&
  634.       (! los_p(m->x,m->y,Player.x,Player.y)) &&
  635.       (random_range(10) == 1))
  636.     mprint("The dungeon shakes!");
  637. }
  638.  
  639.  
  640.  
  641. void m_thief_f(m)
  642. struct monster *m;
  643. {
  644.   int i = random_item();
  645.   if (random_range(3) == 1) {
  646.     if (distance(Player.x,Player.y,m->x,m->y) < 2) {
  647.       if (p_immune(THEFT) || (Player.level > (m->level*2)+random_range(20))) 
  648.     mprint("You feel secure.");
  649.       else {
  650.     if (i == ABORT)
  651.       mprint("You feel fortunate.");
  652.     else if ((Player.possessions[i]->used) || 
  653.          (Player.dex < m->level*random_range(10))) {
  654.       mprint("You feel a sharp tug.... You hold on!");
  655.     }
  656.     else {
  657.       mprint("You feel uneasy for a moment.");
  658.       if (m->uniqueness == COMMON) {
  659.         strcpy(Str2,"The ");
  660.         strcat(Str2,m->monstring);
  661.       }
  662.       else strcpy(Str2,m->monstring);
  663.       strcat(Str2,"suddenly runs away for some reason.");
  664.       mprint(Str2);
  665.       m_teleport(m);
  666.       m->movef = M_MOVE_SCAREDY;
  667.       m->specialf = M_MOVE_SCAREDY;
  668.       m_pickup(m,Player.possessions[i]);
  669.       conform_lost_object(Player.possessions[i]);
  670.     }
  671.       }
  672.     }
  673.   }
  674. }
  675.  
  676.  
  677. void m_summon(m)
  678. struct monster *m;
  679. {
  680.   if ((distance(Player.x,Player.y,m->x,m->y) < 2) &&
  681.       (random_range(3) == 1)) {
  682.     summon(0,-1);
  683.     summon(0,-1);
  684.       }
  685. }      
  686.  
  687.  
  688. void m_aggravate(m)
  689. struct monster *m;
  690. {
  691.  
  692.   if (m_statusp(m,HOSTILE)) {
  693.     if (m->uniqueness == COMMON) {
  694.       strcpy(Str2,"The ");
  695.       strcat(Str2,m->monstring);
  696.     }
  697.     else strcpy(Str2,m->monstring);
  698.     strcat(Str2," emits an irritating humming sound.");
  699.     mprint(Str2);
  700.     aggravate();
  701.     m_status_reset(m,HOSTILE);
  702.   }
  703. }
  704.  
  705.  
  706.  
  707. void m_sp_merchant(m)
  708. struct monster *m;
  709. {
  710.   pml ml;
  711.   if (m_statusp(m,HOSTILE))
  712.     if (Current_Environment == E_VILLAGE) {
  713.       mprint("The merchant screams: 'Help! Murder! Guards! Help!'");
  714.       mprint("You hear the sound of police whistles and running feet.");
  715.       for (ml=Level->mlist;ml!=NULL;ml=ml->next) {
  716.     m_status_set(ml->m,AWAKE);
  717.     m_status_set(ml->m,HOSTILE);
  718.       }
  719.       m->specialf = M_NO_OP;
  720.     }
  721. }
  722.  
  723. /* The special function of the various people in the court of the archmage */
  724. /* and the sorcerors' circle */
  725. void m_sp_court(m)
  726. struct monster *m;
  727. {
  728.   pml ml;
  729.   if (m_statusp(m,HOSTILE)) {
  730.     mprint("A storm of spells hits you!");
  731.     for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
  732.       m_status_set(ml->m,HOSTILE);
  733.       m_sp_spell(ml->m);
  734.       if (ml->m->specialf == M_SP_COURT)
  735.     ml->m->specialf = M_SP_SPELL;
  736.     }
  737.   }
  738. }
  739.  
  740.  
  741. /* The special function of the dragons in the dragons' lair */
  742. void m_sp_lair(m)
  743. struct monster *m;
  744. {
  745.   pml ml;
  746.   if (m_statusp(m,HOSTILE)) {
  747.     if (m->id == ML10+3) m->specialf = M_SP_DRAGONLORD;
  748.     mprint("You notice a number of dragons waking up....");
  749.     mprint("You are struck by a quantity of firebolts.");
  750.     for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
  751.       m_status_set(ml->m,HOSTILE);
  752.       fbolt(ml->m->x,ml->m->y,Player.x,Player.y,100,100);
  753.       if (ml->m->specialf == M_SP_LAIR)
  754.     ml->m->specialf = M_STRIKE_FBOLT;
  755.     }
  756.   }
  757. }
  758.  
  759.  
  760. void m_sp_prime(m)
  761. struct monster *m;
  762. {
  763.   if (m_statusp(m,HOSTILE)) {
  764.     mprint("The prime sorceror gestures and a pentacular gate opens!");
  765.     mprint("You are surrounded by demons!");
  766.     summon(-1,ML9+7);
  767.     summon(-1,ML9+7);
  768.     summon(-1,ML9+7);
  769.     summon(-1,ML9+7);
  770.   }
  771.   m->specialf = M_SP_SPELL;
  772. }
  773.